/**
 * Copyright (C) 2008 Happy Fish / YuQing
 * FastDFS Java Client may be copied only under the terms of the GNU Lesser
 * General Public License (LGPL).
 * Please visit the FastDFS Home Page http://www.csource.org/ for more detail.
 */
package org.csource.fastdfs;

/**
 * C struct body decoder
 * 
 * @author Happy Fish / YuQing
 * @version Version 1.18
 */
public class StructGroupStat extends StructBase {
    protected static final int              FIELD_INDEX_GROUP_NAME            = 0;
    protected static final int              FIELD_INDEX_TOTAL_MB              = 1;
    protected static final int              FIELD_INDEX_FREE_MB               = 2;
    protected static final int              FIELD_INDEX_TRUNK_FREE_MB         = 3;
    protected static final int              FIELD_INDEX_STORAGE_COUNT         = 4;
    protected static final int              FIELD_INDEX_STORAGE_PORT          = 5;
    protected static final int              FIELD_INDEX_STORAGE_HTTP_PORT     = 6;
    protected static final int              FIELD_INDEX_ACTIVE_COUNT          = 7;
    protected static final int              FIELD_INDEX_CURRENT_WRITE_SERVER  = 8;
    protected static final int              FIELD_INDEX_STORE_PATH_COUNT      = 9;
    protected static final int              FIELD_INDEX_SUBDIR_COUNT_PER_PATH = 10;
    protected static final int              FIELD_INDEX_CURRENT_TRUNK_FILE_ID = 11;
    protected static int                    fieldsTotalSize;
    protected static StructBase.FieldInfo[] fieldsArray                       = new StructBase.FieldInfo[12];
    static {
        int offset = 0;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_GROUP_NAME] = new StructBase.FieldInfo("groupName", offset, ProtoCommon.FDFS_GROUP_NAME_MAX_LEN + 1);
        offset += ProtoCommon.FDFS_GROUP_NAME_MAX_LEN + 1;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_TOTAL_MB] = new StructBase.FieldInfo("totalMB", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_FREE_MB] = new StructBase.FieldInfo("freeMB", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_TRUNK_FREE_MB] = new StructBase.FieldInfo("trunkFreeMB", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_STORAGE_COUNT] = new StructBase.FieldInfo("storageCount", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_STORAGE_PORT] = new StructBase.FieldInfo("storagePort", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_STORAGE_HTTP_PORT] = new StructBase.FieldInfo("storageHttpPort", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_ACTIVE_COUNT] = new StructBase.FieldInfo("activeCount", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_CURRENT_WRITE_SERVER] = new StructBase.FieldInfo("currentWriteServer", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_STORE_PATH_COUNT] = new StructBase.FieldInfo("storePathCount", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_SUBDIR_COUNT_PER_PATH] = new StructBase.FieldInfo("subdirCountPerPath", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_CURRENT_TRUNK_FILE_ID] = new StructBase.FieldInfo("currentTrunkFileId", offset, ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE);
        offset += ProtoCommon.FDFS_PROTO_PKG_LEN_SIZE;
        StructGroupStat.fieldsTotalSize = offset;
    }
    protected String                        groupName;                                                       // name of this group
    protected long                          totalMB;                                                         // total disk storage in MB
    protected long                          freeMB;                                                          // free disk space in MB
    protected long                          trunkFreeMB;                                                     // trunk free space in MB
    protected int                           storageCount;                                                    // storage server count
    protected int                           storagePort;                                                     // storage server port
    protected int                           storageHttpPort;                                                 // storage server HTTP port
    protected int                           activeCount;                                                     // active storage server count
    protected int                           currentWriteServer;                                              // current storage server index to
                                                                                                              // upload file
    protected int                           storePathCount;                                                  // store base path count of each storage
                                                                                                              // server
    protected int                           subdirCountPerPath;                                              // sub dir count per store path
    protected int                           currentTrunkFileId;                                              // current trunk file id

    /**
     * get group name
     * 
     * @return group name
     */
    public String getGroupName() {
        return groupName;
    }

    /**
     * get total disk space in MB
     * 
     * @return total disk space in MB
     */
    public long getTotalMB() {
        return totalMB;
    }

    /**
     * get free disk space in MB
     * 
     * @return free disk space in MB
     */
    public long getFreeMB() {
        return freeMB;
    }

    /**
     * get trunk free space in MB
     * 
     * @return trunk free space in MB
     */
    public long getTrunkFreeMB() {
        return trunkFreeMB;
    }

    /**
     * get storage server count in this group
     * 
     * @return storage server count in this group
     */
    public int getStorageCount() {
        return storageCount;
    }

    /**
     * get active storage server count in this group
     * 
     * @return active storage server count in this group
     */
    public int getActiveCount() {
        return activeCount;
    }

    /**
     * get storage server port
     * 
     * @return storage server port
     */
    public int getStoragePort() {
        return storagePort;
    }

    /**
     * get storage server HTTP port
     * 
     * @return storage server HTTP port
     */
    public int getStorageHttpPort() {
        return storageHttpPort;
    }

    /**
     * get current storage server index to upload file
     * 
     * @return current storage server index to upload file
     */
    public int getCurrentWriteServer() {
        return currentWriteServer;
    }

    /**
     * get store base path count of each storage server
     * 
     * @return store base path count of each storage server
     */
    public int getStorePathCount() {
        return storePathCount;
    }

    /**
     * get sub dir count per store path
     * 
     * @return sub dir count per store path
     */
    public int getSubdirCountPerPath() {
        return subdirCountPerPath;
    }

    /**
     * get current trunk file id
     * 
     * @return current trunk file id
     */
    public int getCurrentTrunkFileId() {
        return currentTrunkFileId;
    }

    /**
     * set fields
     * 
     * @param bs
     *            byte array
     * @param offset
     *            start offset
     */
    @Override
    public void setFields(byte[] bs, int offset) {
        groupName = stringValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_GROUP_NAME]);
        totalMB = longValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_TOTAL_MB]);
        freeMB = longValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_FREE_MB]);
        trunkFreeMB = longValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_TRUNK_FREE_MB]);
        storageCount = intValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_STORAGE_COUNT]);
        storagePort = intValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_STORAGE_PORT]);
        storageHttpPort = intValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_STORAGE_HTTP_PORT]);
        activeCount = intValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_ACTIVE_COUNT]);
        currentWriteServer = intValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_CURRENT_WRITE_SERVER]);
        storePathCount = intValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_STORE_PATH_COUNT]);
        subdirCountPerPath = intValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_SUBDIR_COUNT_PER_PATH]);
        currentTrunkFileId = intValue(bs, offset, StructGroupStat.fieldsArray[StructGroupStat.FIELD_INDEX_CURRENT_TRUNK_FILE_ID]);
    }

    /**
     * get fields total size
     * 
     * @return fields total size
     */
    public static int getFieldsTotalSize() {
        return StructGroupStat.fieldsTotalSize;
    }
}
